library(tableone)
Warning: package ‘tableone’ was built under R version 4.2.3
# Note that there's a package that does this smoothly. Need to add it as an alternative at some point
#columnNames<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE)[1,]
#qual_data<-read.csv("../01-RawData/MHHS-1_12202023.csv",header=FALSE,col.names = columnNames)[-c(1:3),]
# write a new version that can be reimported with the proper column classes
#write.csv(qual_data,"../04-ProcessedData/MHHS-1_12202023_cleanheader.csv",row.names=FALSE)
PROMIS_Global v1.2
To score the PROMIS_Global: First check if survey coded Excellent as
1 or as 5. Qualtrics will often reverse them. Higher scores should
reflect better functioning.
PROMIS_Global1_1:PROMIS_Global1_7: Items rated from 5 (excellent) to
1 (Not at all) on original scale; PROMIS_Global1_1:PROMIS_Global1_7 are
reversed from Qualtrics 1-5 defaults
PROMIS_Global2_1: emotional problems; past 7 days; 5 (never) to 1
(always); (global 10) PROMIS_Global2_2: fatigue; past 7 days (global
08)
PROMIS_Global3_1: pain. 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10
For scoring, “2 questions were excluded from the
calculation/evaluation as a result of the questionnaire development
study: Global01 because of its statistical congruence with Global03.
Global09r because of its approximately equal statistical correlation to
physical and mental health.”
The Global Physical Health score is generated by summing responses to
Global03 (PROMIS_Global1_3), Global06 (PROMIS_Global1_7),
Global07rescored (PROMIS_Global3_1), and Global08rescored
(PROMIS_Global2_2). The Global Mental Health score is generated by
summing responses to Global02 (PROMIS_Global1_2), Global04
(PROMIS_Global1_4), Global05(PROMIS_Global1_5), and Global10rescored
(PROMIS_Global2_1)
promis_global<-mhhs_data %>% select(contains("PROMIS"))
#score items so that higher scores reflect better functioning
# pain item: 5=0, 4=1:3, 3=4:6, 2=7:9, 1=10
# renaming the Promis to match the original measure
promis_global<-promis_global %>% rename_with(~sprintf("PROMIS_Global0%d",1:5),.cols=c(PROMIS_Global1_1:PROMIS_Global1_5)) %>% rename(PROMIS_Global09=PROMIS_Global1_6,PROMIS_Global06=PROMIS_Global1_7, PROMIS_Global10=PROMIS_Global2_1, PROMIS_Global08=PROMIS_Global2_2,PROMIS_Global07=PROMIS_Global3_1)%>% mutate(across(c(PROMIS_Global01:PROMIS_Global08),~6-.)) %>%
mutate(PROMIS_Global07=recode(PROMIS_Global07,`0`=5,`1`=4,`2`=4,`3`=4,`4`=3,`5`=3,`6`=3,`7`=2,`8`=2,`9`=2,`10`=1))%>%
rowwise() %>% mutate(PG_PhysHealth=sum(c(PROMIS_Global03,PROMIS_Global06,PROMIS_Global07,PROMIS_Global08)),PG_MentHealth=sum(c(PROMIS_Global02,PROMIS_Global04,PROMIS_Global05,PROMIS_Global10))) %>% ungroup()
promis_global_scoring<-promis_global %>% select(-PROMIS_Global01, -PROMIS_Global09,-PG_PhysHealth,-PG_MentHealth)
key_promis.list<-list(PH=c("PROMIS_Global03","PROMIS_Global06","PROMIS_Global07","PROMIS_Global08"),MH=c("PROMIS_Global02","PROMIS_Global04","PROMIS_Global05","PROMIS_Global10"))
key_promis<-make.keys(nvars=8,key_promis.list,item.labels = colnames(promis_global_scoring))
scales_promis<-scoreItems(key_promis,promis_global_scoring)
summary(scales_promis)
GHSQL
GHSQL has one open-response item. This is not included in the summary
score. Scoring also seems somewhat flexible and includes
informal/formal; personal-emotional/suicide; help from anyone/Help from
no-one.
Range 1-7 (Extremely unlikely to Extremely Likely)
ghsql<-mhhs_data %>% select(contains("GHSQL"))
ghsql<-ghsql %>% mutate(General=rowSums((select(ghsql,GHSQL_Pers_1:GHSQL_Pers_9,GHSQL_SUI_1:GHSQL_SUI_9)))) %>%
rowwise() %>%
mutate(Personal=sum(c_across(GHSQL_Pers_1:GHSQL_Pers_8)),
Suicide=sum(c_across(GHSQL_SUI_1:GHSQL_SUI_8)),
Informal_all=sum(c(GHSQL_Pers_1,GHSQL_SUI_1,GHSQL_Pers_2,GHSQL_SUI_2,GHSQL_Pers_3,GHSQL_SUI_3,GHSQL_Pers_4,GHSQL_SUI_4)),
Formal_all=sum(c(GHSQL_Pers_5,GHSQL_SUI_5,GHSQL_Pers_6,GHSQL_SUI_6,GHSQL_Pers_7,GHSQL_SUI_7,GHSQL_Pers_8,GHSQL_SUI_8)),
None_all=sum(c(GHSQL_Pers_9,GHSQL_SUI_9))) %>%
ungroup() %>% #remove rowwise grouping
mutate(Personal_z=scale(Personal),Suicide_z=scale(Suicide),Informal_all_z=scale(Informal_all),Formal_all_z=scale(Formal_all),None_all_z=scale(None_all))
#make a dataframe with only the items to be scored/that need reliability
ghsql_scoring<-ghsql %>% dplyr::select(1:9,12:20)
key_ghsql.list<-list(General=c(1:18),Personal=c(1:9),Suicide=c(10:18),Formal=c(5,14,6,15,7,16,8,17),Informal=c(1,10,2,11,3,12,4,13))
key_ghsql<-make.keys(18,key_ghsql.list,colnames(ghsql_scoring))
scales_ghsql<-scoreItems(key_ghsql.list,ghsql_scoring)
summary(scales_ghsql)
Call: scoreItems(keys = key_ghsql.list, items = ghsql_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
General Personal Suicide Formal Informal
General 0.78 1.36 1.24 1.07 1.05
Personal 0.87 0.52 1.03 1.16 1.06
Suicide 0.93 0.63 0.72 1.03 1.05
Formal 0.86 0.76 0.80 0.83 0.59
Informal 0.82 0.68 0.79 0.48 0.78
#histogram to explore the range
ghsql %>% select(GHSQL_Pers_1:GHSQL_Pers_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 300 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(GHSQL_SUI_1:GHSQL_SUI_9) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Intimate partner", "Friend","Parent","Other relative","MHP","Phone helpline","Doctor","Minister","Not seek help"))+ theme(axis.text.x = element_text(angle=90))
Warning: Removed 343 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(Informal_all_z,Formal_all_z,None_all_z) %>% gather() %>% ggplot(aes(y=value,x=key)) + geom_boxplot() + scale_x_discrete(labels=c("Informal (Pers + Sui)","Formal (Pers + Sui)","None (Pers + Sui)"))+ theme(axis.text.x = element_text(angle=90))
Warning: attributes are not identical across measure variables; they will be dropped
Warning: Removed 178 rows containing non-finite values (`stat_boxplot()`).

ghsql %>% select(GHSQL_Pers_10_TEXT,GHSQL_SUI_10_TEXT) %>% filter(GHSQL_Pers_10_TEXT!=""|GHSQL_SUI_10_TEXT!="")
save(ghsql,file="../04-ProcessedData/ghsql.RDS")
DASS21
Stress items are 1, 6, 8, 11, 12, 14, 18 Anxiety items are 2, 4, 7,
9, 15, 19, 20,
Depression items are 3, 5, 10, 13, 16, 17, 21
The depression scale assesses dysphoria, hopelessness, devaluation of
life, self-deprecation, lack of interest / involvement, anhedonia and
inertia.
The anxiety scale assesses autonomic arousal, skeletal muscle
effects, situational anxiety, and subjective experience of anxious
affect. The stress scale is sensitive to levels of chronic nonspecific
arousal. It assesses difficulty relaxing, nervous arousal, and being
easily upset / agitated, irritable / over-reactive and impatient.
Scores for depression, anxiety and stress are calculated by summing
the scores for the relevant items
Scores on the DASS-21 will need to be multiplied by 2 to calculate
the final score and stay equivalent with DASS-42.

ISMI29
29-item measure assessing self stigma of mental illness. Includes
subscales: alienation, stereotype endorsement, discrimination
experience, social withdrawal, stigma resistance. Scored from 1-4. The
entire Stigma resistance subscale is reverse scored.
Traditional scoring is dichotomous and uses means.
ismi<-mhhs_data %>% select(contains("ISMI"))
ismi<-ismi %>% rowwise() %>%
mutate(ISMI_Alientation=sum(ISMI29_1,ISMI29_5,ISMI29_8,ISMI29_16,ISMI29_17,ISMI29_21),
ISMI_Stere=sum(ISMI29_2, ISMI29_6,ISMI29_10,ISMI29_18,ISMI29_19,ISMI29_23,ISMI29_29),
ISMI_Discr=sum(ISMI29_3,ISMI29_15,ISMI29_22,ISMI29_25,ISMI29_28),
ISMI_Withdrawal=sum(ISMI29_4,ISMI29_9,ISMI29_11,ISMI29_12,ISMI29_13,ISMI29_20)) %>%
mutate(ISMI29_7=recode(ISMI29_7,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_14=recode(ISMI29_14,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_24=recode(ISMI29_24,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_26=recode(ISMI29_26,`1`=4,`2`=3,`3`=2,`4`=1),
ISMI29_27=recode(ISMI29_27,`1`=4,`2`=3,`3`=2,`4`=1)) %>%
mutate(ISMI_Stigmar=sum(ISMI29_7,ISMI29_14,ISMI29_24,ISMI29_26,ISMI29_27)) %>%
ungroup()
#make a dataframe with only the items to be scored/that need reliability
ismi_scoring<-ismi %>% dplyr::select(ISMI29_1:ISMI29_29)
key_ismi.list<-list(Alien=c(1,5,8,16,17,21),Stereotype=c(2,6,10,18,19,23,29),Discrimination=c(3,15,22,25,28),Withdrawal=c(4,9,11,12,13,20),StigmaR=c(7,14,24,26,27))
key_ismi<-make.keys(29,key_ismi.list,colnames(ismi_scoring))
scales_ismi<-scoreItems(key_ismi.list,ismi_scoring)
summary(scales_ismi)
Call: scoreItems(keys = key_ismi.list, items = ismi_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Alien Stereotype Discrimination Withdrawal StigmaR
Alien 0.81 1.05 1.06 1.07 1.04
Stereotype 0.85 0.80 1.16 1.04 1.30
Discrimination 0.68 0.74 0.51 1.05 1.70
Withdrawal 0.87 0.84 0.67 0.81 1.18
StigmaR 0.32 0.39 0.41 0.36 0.12
ismi$ISMI29_14
[1] NA NA 2 2 2 4 2 3 1 2 2 2 2 4 2 2 1 1 1 3 2 3 4 2
[25] 4 3 4 2 2 2 2 2 2 2 2 1 4 2 3 4 2 3 2 4 3 4 3 2
[49] 3 1 3 2 2 3 4 2 4 2 2 2 2 2 2 2 3 1 2 2 4 2 4 3
[73] 2 1 4 3 3 3 2 4 4 1 NA 2 2 2 3 3 3 4 2 2 3 1 2 2
[97] 4 2 4 3 2 1 2 4 4 2 2 3 2 4 2 1 3 2 4 3 2 4 1 2
[121] 3 3 3 2 1 2 2 1 2 3 2 1 3 3 4 2 1 3 2 2 2 2 NA 4
[145] NA 2 3 2 NA NA 3 1 2 2 2 2 3 1 2 2 2 2 2 3 2 2 4 1
[169] 2 3 4 NA 2 2 2 2 3 2 4 4 2 2 3 NA 2 2 3 3 2 2 1 1
[193] 4 2 2 1 3 1 4 3 2 2 2 4 3 2 4 NA 4 NA 4 3 2 4 2 4
[217] 3 3 2 2 1 2 3 1 3 1 1 2 2 3 4 3 1 2 3 1 2 1 4 2
[241] 1 4 4 2 4 4 1 2 2 3 2 4 4 3 2 2 3 4 3 4 2 2 2 4
[265] 2 4 4 2 2 1 2 4 3 3 3 4 NA 1 1 1 3 4 4 1 1 2 4 4
[289] 2 2 2 NA 2 2 2 1 2 2 4 1 2 1 3 3 3 2 2 4 2 1 2 3
[313] 3 2 1 3 4 4 3 4 2 4 1 2 2 NA NA 4 1 2 3 NA 1 3 2 3
[337] 1 1 3 2 3 3 2 2 2 2 2 1 2 4 1 2 4 4 3 3 1 1 3 2
[361] 1 2 2 1 3 1 1 3 2 3 2 NA NA 2 1 2 2 4 1 4 1 3 2 2
[385] 4 4 2 4 1 1 4 2 1 2 2 1 2 2 4 4 2 2 1 1 3 2 3 4
[409] 2 NA 1 NA 2 2 2 4 2 1 2 4 1 3 2 1 2 3 4 2 2 2 1 NA
[433] 2 NA 3 2 2 2 2 NA 1 3 1 2 2 2 2 1 4 2 3 NA 4 1 NA 1
[457] 4 2 4 2 2 2 2 2 4 4 2 2 3 2 3 2 2 3 1 2 1 2 2 3
[481] 4 2 NA 1 2 NA 4 4 3 4 2 NA 4 3 2 2 2 3 1 2 2 2 4 1
[505] 2 2 3 4 2 NA NA 1 3 2 2 NA 3 2 4 4 NA 1 1 4 4 4 4 NA
[529] 3 1 1 3 2 NA 2 4 3 3 1 NA 2 2 2 2 4 2 2 1 2 2 NA 2
[553] 2 NA NA 1 2 2 2 2 2 2 2 4 NA 2 2 3 2 NA 3 2 1 4 NA 3
[577] 3 1 3 2 2 2 2 2 2 4 2 2 2 2 4 3 2 2 2 1 2 2 2 3
[601] 2 1 2 2 1 3 1 3 2 4 2 1 2 3 2 1 NA 4 4 3 4 4 3 2
[625] 3 2 2 2 1 2 3 4 2 2 2 4 4 3 2 3 4 1 4 2 3 1 2 3
[649] 3 2 3 3 2 2 1 1 1 1 3 1 4 2 3 2 1 1 1 2 4 4 3 2
[673] NA 4 2 1 2 3 2 1 3 4 1 3 4 NA 2 4 2 1 2 3 4 1 4 2
[697] 2 4 2 1 1 2 4 3 NA 1 2 3 1 2 3 2 2 NA 3 2 2 2 2 2
[721] 4 3 3 2 2 2 2 4 1 1 2 1 4 2 1 1 NA 1 3 2 1 3 3 2
[745] 2 2 3 2 1 3 2 3 4 2 1 2 1 1 2 2 2 2 2 3 2 2 4 2
[769] 4 2 2 NA NA 2 3 2 2 NA 1 3 4 4 3 4 2 NA 2 2 3 1 1 2
[793] NA 2 1 2 1 NA 1 2 2 2 2 4 4 2 2 2 2 3 2 3 2 1 2 2
[817] 2 2 3 3 3 3 3 1 2 2 1 4 3 2 NA 3 3 4 1 4 2 1 4 2
[841] 1 3 NA 2 1 2 4 2 2 4 3 2 3 2 3 3 4 2 4 2 1 1 1 3
[865] 3 3 3 2 2 2 1 1 1 2 NA 2 1 3 3 NA 1 2 3 NA NA NA 2
cor(ismi$ISMI_Stigmar,ismi$ISMI_Alientation,use="complete.obs")
[1] -0.1243007
ismi %>% select(ISMI_Alientation,ISMI_Stere,ISMI_Discr,ISMI_Withdrawal,ISMI_Stigmar) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 367 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation:
colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
Warning: Removed 367 rows containing missing values (`geom_point()`).

For some reason, the rescored stigma resistance is a negative
correlation
Distress Disclosure Index
Reverse score items 2, 4, 5, 8, 9, 10. Then sum the 12 items. Higher
scores indicate a higher tendency to disclose distress, lower scores
indicate greater concealment of distress.
ddi<-mhhs_data %>% select(contains("DDI"))
ddi<-ddi %>% mutate(across(c(DDI_2,DDI_4,DDI_5,DDI_8,DDI_9,DDI_10),~6-.)) %>%
rowwise() %>% mutate(DDI_Total=sum(c_across(DDI_1:DDI_12))) %>%
ungroup()
ddi_scoring<-ddi %>% dplyr::select(DDI_1:DDI_12)
key_ddi.list<-list(Total=c(1:12))
key_ddi<-make.keys(12,key_ddi.list,colnames(ddi_scoring))
scales_ddi<-scoreItems(key_ddi.list,ddi_scoring)
summary(scales_ddi)
Call: scoreItems(keys = key_ddi.list, items = ddi_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.91
ddi %>% select(DDI_Total) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 78 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation:
colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
Warning: Removed 78 rows containing missing values (`geom_point()`).

ddi %>% select(DDI_Total) %>% add_column(ghsql %>% select(Personal,Suicide,General,None_all)) %>% cor.plot(.)

# checking the correlations ot ensure they make sense
cor.test(ddi$DDI_Total,ghsql$General)
Pearson's product-moment correlation
data: ddi$DDI_Total and ghsql$General
t = 8.7323, df = 746, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.2380376 0.3681729
sample estimates:
cor
0.3045256
cor.test(ddi$DDI_Total,ghsql$Personal)
Pearson's product-moment correlation
data: ddi$DDI_Total and ghsql$Personal
t = 11.438, df = 780, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.3173029 0.4374647
sample estimates:
cor
0.3789801
cor.test(ddi$DDI_Total,ghsql$Suicide)
Pearson's product-moment correlation
data: ddi$DDI_Total and ghsql$Suicide
t = 9.1746, df = 777, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.2478383 0.3746535
sample estimates:
cor
0.3126384
cor.test(ddi$DDI_Total,ghsql$None_all)
Pearson's product-moment correlation
data: ddi$DDI_Total and ghsql$None_all
t = -15.5, df = 788, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.5350890 -0.4280595
sample estimates:
cor
-0.4833786
save(ddi,file="../04-ProcessedData/ddi122023.RDS")
#BFNE
Consists of 12 items, range 1-5 Items 2, 4, 7, and 10 are reverse
scored Forward= c(‘BFNE_1’, ‘BFNE_3’, ‘BFNE_5’, ‘BFNE_6’, ‘BFNE_8’,
‘BFNE_9’, ‘BFNE_11’, ‘BFNE_12’), Reverse= c(‘BFNE_2’, ‘BFNE_4’,
‘BFNE_7’, ‘BFNE_10’)
Trust respect scale
8 questions 1-strongly disagree; 7 - strongly agree 2,3,5,6
reverse-scored
trs %>% select(TRS_1:TRS_8) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 390 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation:
colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
Warning: Removed 390 rows containing missing values (`geom_point()`).

Trust in Physician Scale
1 (strongly disagree)- 5 (strongly agree) 11 items, unweighted mean
of response reverse scored - 1, 5, 7, 11 original scale alpha = .90
Summary score of medical skepticism was obtained by taking the
unweighted mean of the four items.
tps<-mhhs_data %>% select(contains("tps"))
tps<-tps %>% mutate(across(c(TPS_1,TPS_5,TPS_7,TPS_11),~6-.)) %>%
rowwise() %>% mutate(TPS_Tot=sum(c_across(TPS_1:TPS_11))) %>%
ungroup()
#selecting the write-ins
tps %>% filter(TPS_O!="") %>% select(TPS_O)
tps_scoring<-tps %>% dplyr::select(TPS_1:TPS_11)
key_tps.list<-list(Total=c(1:11))
key_tps<-make.keys(11,key_tps.list,colnames(tps_scoring))
scales_tps<-scoreItems(key_tps.list,tps_scoring)
summary(scales_tps)
Call: scoreItems(keys = key_tps.list, items = tps_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.89
tps %>% select(TPS_1:TPS_11) %>% gather() %>% ggplot(aes(y=value,x=key,color=value))+geom_boxplot()+geom_jitter()
Warning: Removed 705 rows containing non-finite values (`stat_boxplot()`).
Warning: The following aesthetics were dropped during statistical transformation:
colour
ℹ This can happen when ggplot fails to infer the correct grouping structure in
the data.
ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
variable into a factor?
Warning: Removed 705 rows containing missing values (`geom_point()`).

Ethnic Identity Scale
reverse score 4,5,8
save(eis,eis_resp,eis_idfile="../04-ProcessedData/eis122023.RDS")
Error in save(eis, eis_resp, eis_idfile = "../04-ProcessedData/eis122023.RDS") :
object ‘../04-ProcessedData/eis122023.RDS’ not found
Everyday Iniquity - Content
bicf<-mhhs_data %>% select(contains("bicf"))
10 items 1=sd 5 =sa
The numbering is a little odd on the original scale. There’s only 10
items numbered to 14. 7 = 5 8 = 6 11 = 7 12 = 8 13 = 9 14 = 10 reverse
score 7, 8, 11, 12, 13, 14 only for total subscale mean Harmony: 1,
2, 3, 6 Higher scores mean higher harmony (affective) Conflict: 7,
8, 11, 12, 13, 14 Items 2 and 8 are only asked for participants who
self-identified as bicultural.
summary(scales_BICII)
Call: scoreItems(keys = key_BICII.list, items = BICII_scoring)
Scale intercorrelations corrected for attenuation
raw correlations below the diagonal, (unstandardized) alpha on the diagonal
corrected correlations above the diagonal:
Total
Total 0.89
Tosca-3
Relationship assessment scale
Self-concealment
MINI-IPIP
Combining scales for projects
LS0tDQp0aXRsZTogIk1ISFMgU2NvcmluZyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIGxvYWQgbGlicmFyaWVzfQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShhcGFUYWJsZXMpDQpsaWJyYXJ5KHRhYmxlb25lKQ0KbGlicmFyeShkcGx5cikNCg0KYGBgDQoNCmBgYHtyIGNsZWFuIHF1YWx0cmljcyBoZWFkaW5nc30NCiMgTm90ZSB0aGF0IHRoZXJlJ3MgYSBwYWNrYWdlIHRoYXQgZG9lcyB0aGlzIHNtb290aGx5LiBOZWVkIHRvIGFkZCBpdCBhcyBhbiBhbHRlcm5hdGl2ZSBhdCBzb21lIHBvaW50DQoNCiNjb2x1bW5OYW1lczwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFKVsxLF0NCg0KI3F1YWxfZGF0YTwtcmVhZC5jc3YoIi4uLzAxLVJhd0RhdGEvTUhIUy0xXzEyMjAyMDIzLmNzdiIsaGVhZGVyPUZBTFNFLGNvbC5uYW1lcyA9IGNvbHVtbk5hbWVzKVstYygxOjMpLF0NCg0KIyB3cml0ZSBhIG5ldyB2ZXJzaW9uIHRoYXQgY2FuIGJlIHJlaW1wb3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGNvbHVtbiBjbGFzc2VzDQojd3JpdGUuY3N2KHF1YWxfZGF0YSwiLi4vMDQtUHJvY2Vzc2VkRGF0YS9NSEhTLTFfMTIyMDIwMjNfY2xlYW5oZWFkZXIuY3N2Iixyb3cubmFtZXM9RkFMU0UpDQpgYGANCg0KYGBge3IgbG9hZCBkYXRhfQ0KDQptaGhzX2RhdGE8LXJlYWQuY3N2KCIuLi8wNC1Qcm9jZXNzZWREYXRhL01ISFMtMV8xMjIwMjAyM19jbGVhbmhlYWRlci5jc3YiKQ0KDQpgYGANCiMgTWV0YWRhdGEgYW5kIGF0dGVudGlvbiBjaGVja3MNCg0KQUMxIC0gV2UgY2FyZSBhYm91dCB0aGUgcXVhbGl0eSBvZiBvdXIgc3VydmV5IGRhdGEuIEZvciB1cyB0byBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgbWVhc3VyZXMgb2YgeW91ciBvcGluaW9ucywgaXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IHByb3ZpZGUgdGhvdWdodGZ1bCBhbnN3ZXJzIHRvIGVhY2ggcXVlc3Rpb24gaW4gdGhpcyBzdXJ2ZXkuIERvIHlvdSBjb21taXQgdG8gcHJvdmlkaW5nIHRob3VnaHRmdWwgYW5zd2VycyB0byB0aGUgcXVlc3Rpb25zIGluIHRoaXMgc3VydmV5PyAoMT15ZXMpDQoNCipOb3RlcyB0aGF0IEFDMiBpcyB3b25reSBpbiBRdWFsdHJpY3MuIFJlc3BvbnNlIG9wdGlvbnMgYXJlIGNvZGVkOiogDQoxID0gc3Ryb25nbHkgZGlzYWdyZWUNCjIgPSBEaXNhZ3JlZQ0KNSA9IE5laXRoZXIgYWdyZWUgbm9yIGRpc2FncmVlDQo2ID0gQWdyZWUNCjIgPSBTdHJvbmdseSBBZ3JlZQ0KDQpBQzIgLSBUaGVzZSBzdXJ2ZXlzIGNhbiBiZSB2ZXJ5IGxvbmcgYW5kIGEgbGl0dGxlIHRpcmluZy4gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHN0aWxsIHBheWluZyBhdHRlbnRpb24gYmVjYXVzZSB3ZSBjYXJlIGFib3V0IHRoZSBxdWFsaXR5IG9mIHRoZSBkYXRhLiBJZiB5b3UgYXJlIHN0aWxsIHBheWluZyBhdHRlbnRpb24gYW5kIHJlYWR5IHRvIG1vdmUgb24sIHBsZWFzZSBjbGljayBvbiB0aGUgYW5zd2VyIEFncmVlLg0KKkNvbnNpZGVyIHdoZXRoZXIgeW91IHdhbnQgdG8ga25vdyBpZiBwYXJ0aWNpcGFudHMgY2xvc2VseSByZWFkIHRoZSBxdWVzdGlvbiBhbmQgZm9sbG93ZWQgaW5zdHJ1Y3Rpb25zLCBvciB3aGVyZSB0aGV5IHBlcmhhcHMgYW5zd2VyaW5nIGhvbmVzdGx5Kg0KDQpBQzMgLSBBQzMgLSBCYXNlZCBvbiB0aGUgdGV4dCB5b3UgcmVhZCBhYm92ZSwgd2hhdCBjb2xvciBoYXZlIHlvdSBiZWVuIGluc3RydWN0ZWQgdG8gZW50ZXI/IChjb3JyZWN0IGFuc3dlciBpcyAzLWdyZWVuKQ0KDQpBQy00IC0gV2UgY2FyZSBhYm91dCB0aGUgcXVhbGl0eSBvZiBvdXIgc3VydmV5IGRhdGEuIEtub3dpbmcgeW91IHdpbGwgcmVjZWl2ZSBjcmVkaXQgZm9yIGNvbXBsZXRpbmcgdGhpcyBzdXJ2ZXkgcmVnYXJkbGVzcyBvZiB5b3VyIGFuc3dlciwgcGxlYXNlIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uOiBTaG91bGQgd2UgdXNlIHlvdXIgZGF0YT8gKDE9eWVzKQ0KDQoNCmBgYHtyIG1ldGFkYXRhfQ0KIyBzYXZpbmcgdGhlIHN0YXJ0LCBlbmQsIHByb2dyZXNzLCBkdXJhdGlvbiBldGMuDQptZXRhX2RhdGE8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KFN0YXJ0RGF0ZTpSZXNwb25zZUlkLCBjb250YWlucygiQ29uc2VudCIpLHN0YXJ0c193aXRoKCJBQyIpKSAlPiUgbXV0YXRlKER1cmF0aW9uX2luX3NlY29uZHM9RHVyYXRpb24uLmluLnNlY29uZHMuKQ0KDQojSWRlbnRpZnlpbmcgcmVzcG9uc2VzDQp0YWJsZShtZXRhX2RhdGEkQUMzKQ0KdGFibGUobWV0YV9kYXRhJEFDMikNCnRhYmxlKG1ldGFfZGF0YSRBQzEpDQp0YWJsZShtZXRhX2RhdGEkQUM0KQ0KDQojZmluZGluZyAzIG9mIDQgYXR0ZW50aW9uIGNoZWNrcyBhbmQgYSByZWFzb25hYmxlIGR1cmF0aW9uDQptZXRhX2RhdGEgJT4lIGZpbHRlcihBQzE9PTEmQUMzPT0zJkFDND09MSZBQzI9PTZ8QUMxPT0xJkFDMz09MyZBQzQ9PTF8QUMxPT0xJkFDMz09MyZBQzI9PTZ8QUMxPT0xJkFDND09MSZBQzI9PTZ8QUMzPT0zJkFDND09MSZBQzI9PTZ8QUMxPT0xJkFDMz09MyZBQzQ9PTEmQUMyPT02fEFDMT09MSZBQzM9PTMmQUM0PT0xJkFDMj09MnxBQzE9PTEmQUMzPT0zJkFDMj09MikgJT4lICBmaWx0ZXIoRHVyYXRpb25faW5fc2Vjb25kcz4xMjAwJkR1cmF0aW9uX2luX3NlY29uZHM8NTg1MTkpDQoNCiMgRGV0ZXJtaW5lIG91dGxpZXJzIHdpdGggbWVkaWFuIHZhbHVlIHRha2VuIGZvciBhIG5ldyBmaWx0ZXINCm1lZGlhbihib3hwbG90KG1ldGFfZGF0YSREdXJhdGlvbl9pbl9zZWNvbmRzKSRvdXQpICNtZWRpYW4gb3V0bGllciB2YWx1ZQ0KbWV0YV9kYXRhX21lZGlhbmZpbHRlcjwtbWV0YV9kYXRhICU+JSBmaWx0ZXIoRHVyYXRpb25faW5fc2Vjb25kczw1ODUxOSkgDQooYm94cGxvdChtZXRhX2RhdGFfbWVkaWFuZmlsdGVyJER1cmF0aW9uX2luX3NlY29uZHMpJHN0YXRzKQ0KbWVhbihtZXRhX2RhdGFfbWVkaWFuZmlsdGVyJER1cmF0aW9uX2luX3NlY29uZHMpICNhIG1vcmUgcmVhc29uYWJsZSBtZWFuLiBTRCBpcyB0b28gaGlnaCB0byB1c2UgaXQgdG8gZmluZCBhIGxvd2VyIGJvdW5kIHNvIHdpbGwganVzdCB1c2UgaW50dWl0aW9uLiANCg0KI3NhdmUobWV0YV9kYXRhLGZpbGU9Ii4uLzA0LVByb2Nlc3NlZERhdGEvbWV0YV9kYXRhMTIyMDIwMjMuUkRTIikNCg0KYGBgDQoNCmBgYHtyIGRlbW9ncmFwaGljc30NCg0KIyBLbm93IHRoZSByYW5nZSBvZiBwb3NzaWJsZSBhbnN3ZXJzIGZvciBlYWNoIGZhY3RvciBhbmQgbWFrZSBzdXJlIHRvIGluY2x1ZGUgTkENCg0KbWhoc19kZW1vdGJsPC1taGhzX2RhdGEgJT4lIHNlbGVjdChSYWNlX0V0aG4yLEJJQ18xLExBTkdfMSxFRFVDX1BhcixFRFVDX1NlbGYsR0VOREVSLFNFWE9SLE1JTElULElOQ09NRSkgJT4lIA0KbXV0YXRlKA0KUmFjZV9FdGhuMj1mYWN0b3IoUmFjZV9FdGhuMixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHM9YygiTm90IGFuc3dlcmVkIiwiV2hpdGUiLCJCbGFjayIsIkhpc3BhbmljIiwiQXNpYW4iLCJBbWVySW5kaWFuIiwiUGFjaWZpY0lzbGFuZGVyIiwiTXVsdGlyYWNpYWwiKSxleGNsdWRlPU5VTEwpLCANCkJJQ18xPWZhY3RvcihCSUNfMSwgbGV2ZWxzPWMoTkEsMCwxKSxsYWJlbHM9YygiTm90IGFuc3dlcmVkIiwiTm90QmljdWx0dXJhbCIsIkJpY3VsdHVyYWwiKSxleGNsdWRlPU5VTEwpLCANCkxBTkdfMT1mYWN0b3IoTEFOR18xLCBsZXZlbHM9YyhOQSwwLDEpLGxhYmVscz1jKCJOb3QgQW5zd2VyZWQiLCJFbmdsaXNoIGF0IEhvbWUiLCJBZGRpdGlvbmFsIExhbmd1YWdlIGF0IEhvbWUiKSxleGNsdWRlPU5VTEwpLCANCkVEVUNfUGFyPWZhY3RvcihFRFVDX1BhcixsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3KSxsYWJlbHMgPSBjKCJOb3QgYW5zd2VyZWQiLCI8SGlnaCBTY2hvb2wiLCJIaWdoIFNjaG9vbCIsIlNvbWUgY29sbGVnZSIsIkFzc29jaWF0ZXMiLCJCYWNoZWxvcnMiLCJNYXN0ZXJzIiwiRG9jdG9yYWwvUHJvZmVzc2lvbmFsIiksZXhjbHVkZSA9IE5VTEwpLA0KRURVQ19TZWxmPWZhY3RvcihFRFVDX1NlbGYsbGV2ZWxzPWMoTkEsMSwyLDMsNCw1LDYsNyksbGFiZWxzID0gYygiTm90IGFuc3dlcmVkIiwiPEhpZ2ggU2Nob29sIiwiSGlnaCBTY2hvb2wiLCJTb21lIGNvbGxlZ2UiLCJBc3NvY2lhdGVzIiwiQmFjaGVsb3JzIiwiTWFzdGVycyIsIkRvY3RvcmFsL1Byb2Zlc3Npb25hbCIpLGV4Y2x1ZGU9TlVMTCksIA0KR0VOREVSPWZhY3RvcihHRU5ERVIsbGV2ZWxzPWMoTkEsMSwyLDMsNCw1LDYsNyksbGFiZWxzPWMoIk5vdCBhbnN3ZXJlZCIsImNpcy13b21hbiIsImNpcy1tYW4iLCJ0cmFucyB3b21hbiIsInRyYW5zIG1hbiIsIm5vbi1iaW5hcnkiLCJzZWxmLWlkIiwicHJlZmVyIG5vdCB0byByZXNwb25kIiksZXhjbHVkZT1OVUxMKSwgDQpTZXh1YWxPcmllbnRhdGlvbj1mYWN0b3IoU0VYT1IsIGxldmVscz1jKE5BLDEsMiwzLDQsNSw2LDcsOCksIGxhYmVscyA9IGMoIk5vdCBBbnN3ZXJlZCIsIlN0cmFpZ2h0IiwiQmlzZXh1YWwiLCJHYXkiLCJMZXNiaWFuIiwiUXVlZXIiLCJRdWVzdGlvbmluZyIsIlNlbGYtSUQiLCJQcmVmZXIgbm90IHRvIHJlc3BvbmQiKSxleGNsdWRlID0gTlVMTCksIA0KTWlsaXRhcnlTZXJ2aWNlPWZhY3RvcihNSUxJVCxsZXZlbHM9YyhOQSwxLDIsMyw0LDUsNiw3LDgpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJOZXZlciBTZXJ2ZWQiLCJBY3RpdmUgRHV0eSIsIk5hdGlvbmFsIEd1YXJkIiwiTWlsaXRhcnkgU3BvdXNlIiwiTWlsaXRhcnkgRGVwZW5kZW50IiwiVmV0ZXJhbiIsIk90aGVyIiwiUHJlZmVyIG5vdCB0byByZXNwb25kIiksZXhjbHVkZT1OVUxMKSwNCiAgSW5jb21lPWZhY3RvcihJTkNPTUUsbGV2ZWxzPWMoTkEsMSwyLDMsNCw1LDYpLGxhYmVscz1jKCJOb3QgYW5zd2VyZWQiLCJMZXNzIHRoYW4gMTBrIiwiMTAsMDAwLTIwLDAwMCIsIjIwLDAwMC01MCwwMDAiLCI1MCwwMDAtMTAwLDAwMCIsIjEwMCwwMDAtMTUwLDAwMCIsIjE1MCwwMDArIiksZXhjbHVkZSA9IE5VTEwpKSAlPiUgDQpzZWxlY3QoLU1JTElULC1TRVhPUikNCg0KQ3JlYXRlVGFibGVPbmUoZGF0YT1taGhzX2RlbW90YmwpDQoNCiNzYXZlKG1oaHNfZGVtb3RibCxmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL0RlbW90YWJsZTEyMjAyMy5SRFMiKQ0KYGBgDQoNCiMgUFJPTUlTX0dsb2JhbCB2MS4yDQpUbyBzY29yZSB0aGUgUFJPTUlTX0dsb2JhbDoNCkZpcnN0IGNoZWNrIGlmIHN1cnZleSBjb2RlZCBFeGNlbGxlbnQgYXMgMSBvciBhcyA1LiBRdWFsdHJpY3Mgd2lsbCBvZnRlbiByZXZlcnNlIHRoZW0uIEhpZ2hlciBzY29yZXMgc2hvdWxkIHJlZmxlY3QgYmV0dGVyIGZ1bmN0aW9uaW5nLg0KDQpQUk9NSVNfR2xvYmFsMV8xOlBST01JU19HbG9iYWwxXzc6IEl0ZW1zIHJhdGVkIGZyb20gNSAoZXhjZWxsZW50KSB0byAxIChOb3QgYXQgYWxsKSBvbiBvcmlnaW5hbCBzY2FsZTsNClBST01JU19HbG9iYWwxXzE6UFJPTUlTX0dsb2JhbDFfNyBhcmUgcmV2ZXJzZWQgZnJvbSBRdWFsdHJpY3MgMS01IGRlZmF1bHRzDQoNClBST01JU19HbG9iYWwyXzE6IGVtb3Rpb25hbCBwcm9ibGVtczsgcGFzdCA3IGRheXM7IDUgKG5ldmVyKSB0byAxIChhbHdheXMpOyAoZ2xvYmFsIDEwKQ0KUFJPTUlTX0dsb2JhbDJfMjogZmF0aWd1ZTsgcGFzdCA3IGRheXMgKGdsb2JhbCAwOCkNCg0KUFJPTUlTX0dsb2JhbDNfMTogcGFpbi4gNT0wLCA0PTE6MywgMz00OjYsIDI9Nzo5LCAxPTEwDQoNCkZvciBzY29yaW5nLCAgIjIgcXVlc3Rpb25zIHdlcmUgZXhjbHVkZWQgZnJvbSB0aGUgY2FsY3VsYXRpb24vZXZhbHVhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGUgcXVlc3Rpb25uYWlyZSBkZXZlbG9wbWVudCBzdHVkeTogR2xvYmFsMDEgYmVjYXVzZSBvZiBpdHMgc3RhdGlzdGljYWwgY29uZ3J1ZW5jZSB3aXRoIEdsb2JhbDAzLiBHbG9iYWwwOXIgYmVjYXVzZSBvZiBpdHMgYXBwcm94aW1hdGVseSBlcXVhbCBzdGF0aXN0aWNhbCBjb3JyZWxhdGlvbiB0byBwaHlzaWNhbCBhbmQgbWVudGFsIGhlYWx0aC4iDQoNClRoZSBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIHNjb3JlIGlzIGdlbmVyYXRlZCBieSBzdW1taW5nIHJlc3BvbnNlcyB0bw0KR2xvYmFsMDMgKFBST01JU19HbG9iYWwxXzMpLCBHbG9iYWwwNiAoUFJPTUlTX0dsb2JhbDFfNyksIEdsb2JhbDA3cmVzY29yZWQgKFBST01JU19HbG9iYWwzXzEpLCBhbmQgR2xvYmFsMDhyZXNjb3JlZCAoUFJPTUlTX0dsb2JhbDJfMikuIFRoZSBHbG9iYWwgTWVudGFsIEhlYWx0aCBzY29yZQ0KaXMgZ2VuZXJhdGVkIGJ5IHN1bW1pbmcgcmVzcG9uc2VzIHRvIEdsb2JhbDAyIChQUk9NSVNfR2xvYmFsMV8yKSwgR2xvYmFsMDQgKFBST01JU19HbG9iYWwxXzQpLCBHbG9iYWwwNShQUk9NSVNfR2xvYmFsMV81KSwgYW5kIEdsb2JhbDEwcmVzY29yZWQgKFBST01JU19HbG9iYWwyXzEpDQoNCmBgYHtyIFBST01JU30NCnByb21pc19nbG9iYWw8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJQUk9NSVMiKSkNCg0KI3Njb3JlIGl0ZW1zIHNvIHRoYXQgaGlnaGVyIHNjb3JlcyByZWZsZWN0IGJldHRlciBmdW5jdGlvbmluZyANCg0KIyBwYWluIGl0ZW06IDU9MCwgND0xOjMsIDM9NDo2LCAyPTc6OSwgMT0xMA0KDQojIHJlbmFtaW5nIHRoZSBQcm9taXMgdG8gbWF0Y2ggdGhlIG9yaWdpbmFsIG1lYXN1cmUNCg0KcHJvbWlzX2dsb2JhbDwtcHJvbWlzX2dsb2JhbCAlPiUgcmVuYW1lX3dpdGgofnNwcmludGYoIlBST01JU19HbG9iYWwwJWQiLDE6NSksLmNvbHM9YyhQUk9NSVNfR2xvYmFsMV8xOlBST01JU19HbG9iYWwxXzUpKSAlPiUgIHJlbmFtZShQUk9NSVNfR2xvYmFsMDk9UFJPTUlTX0dsb2JhbDFfNixQUk9NSVNfR2xvYmFsMDY9UFJPTUlTX0dsb2JhbDFfNywgUFJPTUlTX0dsb2JhbDEwPVBST01JU19HbG9iYWwyXzEsIFBST01JU19HbG9iYWwwOD1QUk9NSVNfR2xvYmFsMl8yLFBST01JU19HbG9iYWwwNz1QUk9NSVNfR2xvYmFsM18xKSU+JSBtdXRhdGUoYWNyb3NzKGMoUFJPTUlTX0dsb2JhbDAxOlBST01JU19HbG9iYWwwOCksfjYtLikpICU+JSANCiAgbXV0YXRlKFBST01JU19HbG9iYWwwNz1yZWNvZGUoUFJPTUlTX0dsb2JhbDA3LGAwYD01LGAxYD00LGAyYD00LGAzYD00LGA0YD0zLGA1YD0zLGA2YD0zLGA3YD0yLGA4YD0yLGA5YD0yLGAxMGA9MSkpJT4lIA0KICByb3d3aXNlKCkgJT4lICBtdXRhdGUoUEdfUGh5c0hlYWx0aD1zdW0oYyhQUk9NSVNfR2xvYmFsMDMsUFJPTUlTX0dsb2JhbDA2LFBST01JU19HbG9iYWwwNyxQUk9NSVNfR2xvYmFsMDgpKSxQR19NZW50SGVhbHRoPXN1bShjKFBST01JU19HbG9iYWwwMixQUk9NSVNfR2xvYmFsMDQsUFJPTUlTX0dsb2JhbDA1LFBST01JU19HbG9iYWwxMCkpKSAlPiUgdW5ncm91cCgpDQoNCnByb21pc19nbG9iYWxfc2NvcmluZzwtcHJvbWlzX2dsb2JhbCAlPiUgc2VsZWN0KC1QUk9NSVNfR2xvYmFsMDEsIC1QUk9NSVNfR2xvYmFsMDksLVBHX1BoeXNIZWFsdGgsLVBHX01lbnRIZWFsdGgpDQoNCmtleV9wcm9taXMubGlzdDwtbGlzdChQSD1jKCJQUk9NSVNfR2xvYmFsMDMiLCJQUk9NSVNfR2xvYmFsMDYiLCJQUk9NSVNfR2xvYmFsMDciLCJQUk9NSVNfR2xvYmFsMDgiKSxNSD1jKCJQUk9NSVNfR2xvYmFsMDIiLCJQUk9NSVNfR2xvYmFsMDQiLCJQUk9NSVNfR2xvYmFsMDUiLCJQUk9NSVNfR2xvYmFsMTAiKSkNCg0Ka2V5X3Byb21pczwtbWFrZS5rZXlzKG52YXJzPTgsa2V5X3Byb21pcy5saXN0LGl0ZW0ubGFiZWxzID0gY29sbmFtZXMocHJvbWlzX2dsb2JhbF9zY29yaW5nKSkNCnNjYWxlc19wcm9taXM8LXNjb3JlSXRlbXMoa2V5X3Byb21pcyxwcm9taXNfZ2xvYmFsX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19wcm9taXMpDQoNCmBgYA0KDQojIEdIU1FMDQpHSFNRTCBoYXMgb25lIG9wZW4tcmVzcG9uc2UgaXRlbS4gVGhpcyBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgc2NvcmUuIFNjb3JpbmcgYWxzbyBzZWVtcyBzb21ld2hhdCBmbGV4aWJsZSBhbmQgaW5jbHVkZXMgaW5mb3JtYWwvZm9ybWFsOyBwZXJzb25hbC1lbW90aW9uYWwvc3VpY2lkZTsgaGVscCBmcm9tIGFueW9uZS9IZWxwIGZyb20gbm8tb25lLg0KDQpSYW5nZSAxLTcgKEV4dHJlbWVseSB1bmxpa2VseSB0byBFeHRyZW1lbHkgTGlrZWx5KQ0KDQpgYGB7ciBHSFNRTH0NCmdoc3FsPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiR0hTUUwiKSkNCg0KZ2hzcWw8LWdoc3FsICU+JSBtdXRhdGUoR2VuZXJhbD1yb3dTdW1zKChzZWxlY3QoZ2hzcWwsR0hTUUxfUGVyc18xOkdIU1FMX1BlcnNfOSxHSFNRTF9TVUlfMTpHSFNRTF9TVUlfOSkpKSkgJT4lIA0KIHJvd3dpc2UoKSAlPiUgIA0KICBtdXRhdGUoUGVyc29uYWw9c3VtKGNfYWNyb3NzKEdIU1FMX1BlcnNfMTpHSFNRTF9QZXJzXzgpKSwNCiAgICAgICAgIFN1aWNpZGU9c3VtKGNfYWNyb3NzKEdIU1FMX1NVSV8xOkdIU1FMX1NVSV84KSksDQogICAgICAgICBJbmZvcm1hbF9hbGw9c3VtKGMoR0hTUUxfUGVyc18xLEdIU1FMX1NVSV8xLEdIU1FMX1BlcnNfMixHSFNRTF9TVUlfMixHSFNRTF9QZXJzXzMsR0hTUUxfU1VJXzMsR0hTUUxfUGVyc180LEdIU1FMX1NVSV80KSksDQogICAgICAgICBGb3JtYWxfYWxsPXN1bShjKEdIU1FMX1BlcnNfNSxHSFNRTF9TVUlfNSxHSFNRTF9QZXJzXzYsR0hTUUxfU1VJXzYsR0hTUUxfUGVyc183LEdIU1FMX1NVSV83LEdIU1FMX1BlcnNfOCxHSFNRTF9TVUlfOCkpLA0KICAgICAgICAgTm9uZV9hbGw9c3VtKGMoR0hTUUxfUGVyc185LEdIU1FMX1NVSV85KSkpICU+JSANCiAgdW5ncm91cCgpICU+JSAjcmVtb3ZlIHJvd3dpc2UgZ3JvdXBpbmcgDQogIG11dGF0ZShQZXJzb25hbF96PXNjYWxlKFBlcnNvbmFsKSxTdWljaWRlX3o9c2NhbGUoU3VpY2lkZSksSW5mb3JtYWxfYWxsX3o9c2NhbGUoSW5mb3JtYWxfYWxsKSxGb3JtYWxfYWxsX3o9c2NhbGUoRm9ybWFsX2FsbCksTm9uZV9hbGxfej1zY2FsZShOb25lX2FsbCkpDQoNCiNtYWtlIGEgZGF0YWZyYW1lIHdpdGggb25seSB0aGUgaXRlbXMgdG8gYmUgc2NvcmVkL3RoYXQgbmVlZCByZWxpYWJpbGl0eQ0KZ2hzcWxfc2NvcmluZzwtZ2hzcWwgJT4lIGRwbHlyOjpzZWxlY3QoMTo5LDEyOjIwKQ0Ka2V5X2doc3FsLmxpc3Q8LWxpc3QoR2VuZXJhbD1jKDE6MTgpLFBlcnNvbmFsPWMoMTo5KSxTdWljaWRlPWMoMTA6MTgpLEZvcm1hbD1jKDUsMTQsNiwxNSw3LDE2LDgsMTcpLEluZm9ybWFsPWMoMSwxMCwyLDExLDMsMTIsNCwxMykpDQprZXlfZ2hzcWw8LW1ha2Uua2V5cygxOCxrZXlfZ2hzcWwubGlzdCxjb2xuYW1lcyhnaHNxbF9zY29yaW5nKSkNCg0Kc2NhbGVzX2doc3FsPC1zY29yZUl0ZW1zKGtleV9naHNxbC5saXN0LGdoc3FsX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19naHNxbCkNCg0KI2hpc3RvZ3JhbSB0byBleHBsb3JlIHRoZSByYW5nZSANCmdoc3FsICU+JSBzZWxlY3QoR0hTUUxfUGVyc18xOkdIU1FMX1BlcnNfOSkgJT4lIGdhdGhlcigpICU+JSBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXkpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiSW50aW1hdGUgcGFydG5lciIsICJGcmllbmQiLCJQYXJlbnQiLCJPdGhlciByZWxhdGl2ZSIsIk1IUCIsIlBob25lIGhlbHBsaW5lIiwiRG9jdG9yIiwiTWluaXN0ZXIiLCJOb3Qgc2VlayBoZWxwIikpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpDQoNCmdoc3FsICU+JSBzZWxlY3QoR0hTUUxfU1VJXzE6R0hTUUxfU1VJXzkpICU+JSBnYXRoZXIoKSAlPiUgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5KSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkludGltYXRlIHBhcnRuZXIiLCAiRnJpZW5kIiwiUGFyZW50IiwiT3RoZXIgcmVsYXRpdmUiLCJNSFAiLCJQaG9uZSBoZWxwbGluZSIsIkRvY3RvciIsIk1pbmlzdGVyIiwiTm90IHNlZWsgaGVscCIpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTApKQ0KDQpnaHNxbCAlPiUgc2VsZWN0KEluZm9ybWFsX2FsbF96LEZvcm1hbF9hbGxfeixOb25lX2FsbF96KSAlPiUgZ2F0aGVyKCkgJT4lIGdncGxvdChhZXMoeT12YWx1ZSx4PWtleSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJJbmZvcm1hbCAoUGVycyArIFN1aSkiLCJGb3JtYWwgKFBlcnMgKyBTdWkpIiwiTm9uZSAoUGVycyArIFN1aSkiKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwKSkNCg0KZ2hzcWwgJT4lIHNlbGVjdChHSFNRTF9QZXJzXzEwX1RFWFQsR0hTUUxfU1VJXzEwX1RFWFQpICU+JSBmaWx0ZXIoR0hTUUxfUGVyc18xMF9URVhUIT0iInxHSFNRTF9TVUlfMTBfVEVYVCE9IiIpDQoNCiNzYXZlKGdoc3FsLGZpbGU9Ii4uLzA0LVByb2Nlc3NlZERhdGEvZ2hzcWwxMjIwMjMuUkRTIikNCmBgYA0KDQojIERBU1MyMQ0KDQpTdHJlc3MgaXRlbXMgYXJlIDEsIDYsIDgsIDExLCAxMiwgMTQsIDE4DQpBbnhpZXR5IGl0ZW1zIGFyZSAyLCA0LCA3LCA5LCAxNSwgMTksIDIwLCAgDQpEZXByZXNzaW9uIGl0ZW1zIGFyZSAzLCA1LCAxMCwgMTMsIDE2LCAxNywgMjEgDQoNClRoZSBkZXByZXNzaW9uIHNjYWxlIGFzc2Vzc2VzIGR5c3Bob3JpYSwgaG9wZWxlc3NuZXNzLCBkZXZhbHVhdGlvbiBvZiBsaWZlLCBzZWxmLWRlcHJlY2F0aW9uLCBsYWNrIG9mIGludGVyZXN0IC8gaW52b2x2ZW1lbnQsIGFuaGVkb25pYSBhbmQgaW5lcnRpYS4gDQoNClRoZSBhbnhpZXR5IHNjYWxlIGFzc2Vzc2VzIGF1dG9ub21pYyBhcm91c2FsLCBza2VsZXRhbCBtdXNjbGUgZWZmZWN0cywgc2l0dWF0aW9uYWwgYW54aWV0eSwgYW5kIHN1YmplY3RpdmUgZXhwZXJpZW5jZSBvZiBhbnhpb3VzIGFmZmVjdC4gDQpUaGUgc3RyZXNzIHNjYWxlIGlzIHNlbnNpdGl2ZSB0byBsZXZlbHMgb2YgY2hyb25pYyBub25zcGVjaWZpYyBhcm91c2FsLiBJdCBhc3Nlc3NlcyBkaWZmaWN1bHR5IHJlbGF4aW5nLCBuZXJ2b3VzIGFyb3VzYWwsIGFuZCBiZWluZyBlYXNpbHkgdXBzZXQgLyBhZ2l0YXRlZCwgaXJyaXRhYmxlIC8gb3Zlci1yZWFjdGl2ZSBhbmQgaW1wYXRpZW50LiANCg0KU2NvcmVzIGZvciBkZXByZXNzaW9uLCBhbnhpZXR5IGFuZCBzdHJlc3MgYXJlIGNhbGN1bGF0ZWQgYnkgc3VtbWluZyB0aGUgc2NvcmVzIGZvciB0aGUgcmVsZXZhbnQgaXRlbXMNCg0KU2NvcmVzIG9uIHRoZSBEQVNTLTIxIHdpbGwgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IDIgdG8gY2FsY3VsYXRlIHRoZSBmaW5hbCBzY29yZSBhbmQgc3RheSBlcXVpdmFsZW50IHdpdGggREFTUy00Mi4NCmBgYHtyIERBU1MyMX0NCmRhc3M8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJEQVNTIikpDQoNCmRhc3M8LWRhc3MgJT4lIG11dGF0ZShEYXNzMjFfVG90YWw9cm93U3Vtcygoc2VsZWN0KGRhc3MsREFTUzIxXzE6REFTUzIxXzIxKSkpKjIpICU+JSANCiByb3d3aXNlKCkgJT4lICANCiAgbXV0YXRlKERhc3MyMV9TdHJlc3M9c3VtKERBU1MyMV8xLERBU1MyMV82LCBEQVNTMjFfOCxEQVNTMjFfMTEsREFTUzIxXzEyLERBU1MyMV8xNCxEQVNTMjFfMTgsbmEucm0gPSBUKSwNCiAgICAgICAgIERhc3MyMV9BbnhpZXR5PXN1bShEQVNTMjFfMixEQVNTMjFfNCxEQVNTMjFfNyxEQVNTMjFfOSxEQVNTMjFfMTUsREFTUzIxXzE5LERBU1MyMV8yMCwgbmEucm09VCksDQogICAgICAgICBEYXNzMjFfRGVwcmVzc2lvbj1zdW0oREFTUzIxXzMsREFTUzIxXzUsREFTUzIxXzEwLERBU1MyMV8xMyxEQVNTMjFfMTYsREFTUzIxXzE3LERBU1MyMV8yMSwgbmEucm09VCkpICU+JSANCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoRGFzczIxX1N0cmVzc196PXNjYWxlKC4sKSkgJT4lDQogIG11dGF0ZShEZXBfY3V0cz1jYXNlX3doZW4oRGFzczIxX0RlcHJlc3Npb248MTB+Ik5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9EZXByZXNzaW9uPDE0fiJNaWxkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb248MjF+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0RlcHJlc3Npb248Mjh+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9EZXByZXNzaW9uPjI3fiJFeHRyZW1lbHlfU2V2ZXJlIiksDQogICAgICAgICAgICAgICAgQW54X2N1dHM9Y2FzZV93aGVuKERhc3MyMV9BbnhpZXR5PDh+Ik5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9BbnhpZXR5PDEwfiJNaWxkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk8MTV+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFzczIxX0FueGlldHk8MjB+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9BbnhpZXR5PjE5fiJFeHRyZW1lbHlfU2V2ZXJlIiksDQogICAgICAgICAgICAgICAgU3RyZXNzX2N1dHM9Y2FzZV93aGVuKERhc3MyMV9TdHJlc3M8MTV+Ik5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9TdHJlc3M8MTl+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXNzMjFfU3RyZXNzPDI2fiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9TdHJlc3M8MzR+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhc3MyMV9TdHJlc3M+MzN+IkV4dHJlbWVseV9TZXZlcmUiKSkNCg0KDQojbWFrZSBhIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIGl0ZW1zIHRvIGJlIHNjb3JlZC90aGF0IG5lZWQgcmVsaWFiaWxpdHkNCmRhc3Nfc2NvcmluZzwtZGFzcyAlPiUgZHBseXI6OnNlbGVjdChEQVNTMjFfMTpEQVNTMjFfMjEpDQprZXlfZGFzcy5saXN0PC1saXN0KFN0cmVzcz1jKDEsNiw4LDExLDEyLDE0LDE4KSxBbnhpZXR5PWMoMiw0LDcsOSwxNSwxOSwyMCksRGVwcmVzc2lvbj1jKDMsNSwxMCwxMywxNiwxNywyMSkpDQoNCmtleV9kYXNzPC1tYWtlLmtleXMoMjEsa2V5X2Rhc3MubGlzdCxjb2xuYW1lcyhkYXNzX3Njb3JpbmcpKQ0KDQpzY2FsZXNfZGFzczwtc2NvcmVJdGVtcyhrZXlfZGFzcy5saXN0LGRhc3Nfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX2Rhc3MpDQoNCiNoaXN0b2dyYW0gdG8gZXhwbG9yZSB0aGUgcmFuZ2UgDQpkYXNzICU+JSBzZWxlY3QoRGFzczIxX1N0cmVzcyxEYXNzMjFfQW54aWV0eSwgRGFzczIxX0RlcHJlc3Npb24pICU+JSBnYXRoZXIoKSAlPiUgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5KSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIlN0cmVzcyIsIkFueGlldHkiLCJEZXByZXNzaW9uIikpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCkpDQoNCiNzY2F0dGVycGxvdCB0byBjb2xvciB0aGUgY3V0b2Zmcw0KZGFzc19zY2F0dGVyPC1kYXNzICU+JSAgc2VsZWN0KERhc3MyMV9TdHJlc3MsRGFzczIxX0FueGlldHksIERhc3MyMV9EZXByZXNzaW9uKSAlPiUgDQpwaXZvdF9sb25nZXIoY29scz1zdGFydHNfd2l0aCgiRGFzczIxIiksbmFtZXNfdG8gPSAiU3Vic2NhbGUiLHZhbHVlc190byA9ICJzY29yZSIpICU+JSAgIG11dGF0ZShDdXRzPWNhc2Vfd2hlbigoU3Vic2NhbGU9PSJEYXNzMjFfRGVwcmVzc2lvbiIgJiBzY29yZTwxMCkgfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwxNCl+Ik1pbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZTwyMSl+Ik1vZGVyYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9EZXByZXNzaW9uIiYgc2NvcmU8MjgpfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSAiRGFzczIxX0RlcHJlc3Npb24iJiBzY29yZT4yNyl+IkV4dHJlbWVseV9TZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDgpfiJOb3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPDEwKX4iTWlsZCIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MTUpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9BbnhpZXR5IiYgc2NvcmU8MjApfiJTZXZlcmUiLA0KICAgICAgICAgICAgICAgICAgICAgIChTdWJzY2FsZT09ICJEYXNzMjFfQW54aWV0eSImIHNjb3JlPjE5KX4iRXh0cmVtZWx5X1NldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0iRGFzczIxX1N0cmVzcyImIHNjb3JlPDE1KX4iTm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MTkpfiJNaWxkIiwNCiAgICAgICAgICAgICAgICAgICAgICAoU3Vic2NhbGU9PSJEYXNzMjFfU3RyZXNzIiYgc2NvcmU8MjYpfiJNb2RlcmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZTwzNCl+IlNldmVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgKFN1YnNjYWxlPT0gIkRhc3MyMV9TdHJlc3MiJiBzY29yZT4zMyl+IkV4dHJlbWVseV9TZXZlcmUiKSkNCg0KDQojc2V2ZXJpdHkgaGlzdG9ncmFtIGNvbG9yZWQgYnkgc2V2ZXJpdHkNCmRhc3Nfc2NhdHRlciAlPiUgZ2dwbG90KGFlcyhzY29yZSxmaWxsPVN1YnNjYWxlLGdyb3VwPVN1YnNjYWxlKSkrZ2VvbV9iYXIoKQ0KDQojaml0dGVyIHBsb3QgY29sb3JlZCBieSBzZXZlcml0eQ0KZGFzc19zY2F0dGVyICU+JSBnZ3Bsb3QoYWVzKHg9U3Vic2NhbGUseT1zY29yZSxjb2xvdXI9Q3V0cykpK2dlb21faml0dGVyKCkrdGhlbWVfY2xhc3NpYygpK3NjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQ0KDQojc2F2ZShkYXNzLGRhc3Nfc2NhdHRlcixmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL2Rhc3MxMjIwMjMuUkRTIikNCmBgYA0KIyBJU01JMjkNCjI5LWl0ZW0gbWVhc3VyZSBhc3Nlc3Npbmcgc2VsZiBzdGlnbWEgb2YgbWVudGFsIGlsbG5lc3MuIEluY2x1ZGVzIHN1YnNjYWxlczogYWxpZW5hdGlvbiwgc3RlcmVvdHlwZSBlbmRvcnNlbWVudCwgZGlzY3JpbWluYXRpb24gZXhwZXJpZW5jZSwgc29jaWFsIHdpdGhkcmF3YWwsIHN0aWdtYSByZXNpc3RhbmNlLiBTY29yZWQgZnJvbSAxLTQuIFRoZSBlbnRpcmUgU3RpZ21hIHJlc2lzdGFuY2Ugc3Vic2NhbGUgaXMgcmV2ZXJzZSBzY29yZWQuDQoNClRyYWRpdGlvbmFsIHNjb3JpbmcgaXMgZGljaG90b21vdXMgYW5kIHVzZXMgbWVhbnMuIA0KDQpgYGB7ciBJU01JIDI5fQ0KaXNtaTwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIklTTUkiKSkNCg0KaXNtaTwtaXNtaSAlPiUgcm93d2lzZSgpICU+JSAgDQogIG11dGF0ZShJU01JX0FsaWVudGF0aW9uPXN1bShJU01JMjlfMSxJU01JMjlfNSxJU01JMjlfOCxJU01JMjlfMTYsSVNNSTI5XzE3LElTTUkyOV8yMSksDQogICAgICAgICBJU01JX1N0ZXJlPXN1bShJU01JMjlfMiwgSVNNSTI5XzYsSVNNSTI5XzEwLElTTUkyOV8xOCxJU01JMjlfMTksSVNNSTI5XzIzLElTTUkyOV8yOSksDQogICAgICAgICBJU01JX0Rpc2NyPXN1bShJU01JMjlfMyxJU01JMjlfMTUsSVNNSTI5XzIyLElTTUkyOV8yNSxJU01JMjlfMjgpLA0KICAgIElTTUlfV2l0aGRyYXdhbD1zdW0oSVNNSTI5XzQsSVNNSTI5XzksSVNNSTI5XzExLElTTUkyOV8xMixJU01JMjlfMTMsSVNNSTI5XzIwKSkgJT4lIA0KICAgICAgbXV0YXRlKElTTUkyOV83PXJlY29kZShJU01JMjlfNyxgMWA9NCxgMmA9MyxgM2A9MixgNGA9MSksDQogICAgICAgICAgICBJU01JMjlfMTQ9cmVjb2RlKElTTUkyOV8xNCxgMWA9NCxgMmA9MyxgM2A9MixgNGA9MSksDQogICAgICAgICBJU01JMjlfMjQ9cmVjb2RlKElTTUkyOV8yNCxgMWA9NCxgMmA9MyxgM2A9MixgNGA9MSksDQogICAgICAgICAgSVNNSTI5XzI2PXJlY29kZShJU01JMjlfMjYsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpLA0KICAgICAgICAgSVNNSTI5XzI3PXJlY29kZShJU01JMjlfMjcsYDFgPTQsYDJgPTMsYDNgPTIsYDRgPTEpKSAlPiUgIA0KICAgICAgbXV0YXRlKElTTUlfU3RpZ21hcj1zdW0oSVNNSTI5XzcsSVNNSTI5XzE0LElTTUkyOV8yNCxJU01JMjlfMjYsSVNNSTI5XzI3KSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KDQojbWFrZSBhIGRhdGFmcmFtZSB3aXRoIG9ubHkgdGhlIGl0ZW1zIHRvIGJlIHNjb3JlZC90aGF0IG5lZWQgcmVsaWFiaWxpdHkNCmlzbWlfc2NvcmluZzwtaXNtaSAlPiUgZHBseXI6OnNlbGVjdChJU01JMjlfMTpJU01JMjlfMjkpDQprZXlfaXNtaS5saXN0PC1saXN0KEFsaWVuPWMoMSw1LDgsMTYsMTcsMjEpLFN0ZXJlb3R5cGU9YygyLDYsMTAsMTgsMTksMjMsMjkpLERpc2NyaW1pbmF0aW9uPWMoMywxNSwyMiwyNSwyOCksV2l0aGRyYXdhbD1jKDQsOSwxMSwxMiwxMywyMCksU3RpZ21hUj1jKDcsMTQsMjQsMjYsMjcpKQ0KDQprZXlfaXNtaTwtbWFrZS5rZXlzKDI5LGtleV9pc21pLmxpc3QsY29sbmFtZXMoaXNtaV9zY29yaW5nKSkNCg0Kc2NhbGVzX2lzbWk8LXNjb3JlSXRlbXMoa2V5X2lzbWkubGlzdCxpc21pX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19pc21pKQ0KDQppc21pJElTTUkyOV8xNA0KY29yKGlzbWkkSVNNSV9TdGlnbWFyLGlzbWkkSVNNSV9BbGllbnRhdGlvbix1c2U9ImNvbXBsZXRlLm9icyIpDQoNCmlzbWkgJT4lIHNlbGVjdChJU01JX0FsaWVudGF0aW9uLElTTUlfU3RlcmUsSVNNSV9EaXNjcixJU01JX1dpdGhkcmF3YWwsSVNNSV9TdGlnbWFyKSAlPiUgZ2F0aGVyKCkgJT4lICBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXksY29sb3I9dmFsdWUpKStnZW9tX2JveHBsb3QoKStnZW9tX2ppdHRlcigpDQoNCiNzYXZlKGlzbWksZmlsZT0iLi4vMDQtUHJvY2Vzc2VkRGF0YS9pc21pMTIyMDIzLlJEUyIpDQpgYGANCkZvciBzb21lIHJlYXNvbiwgdGhlIHJlc2NvcmVkIHN0aWdtYSByZXNpc3RhbmNlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24NCg0KIyBEaXN0cmVzcyBEaXNjbG9zdXJlIEluZGV4DQoNClJldmVyc2Ugc2NvcmUgaXRlbXMgMiwgNCwgNSwgOCwgOSwgMTAuIFRoZW4gc3VtIHRoZSAxMiBpdGVtcy4gSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBhIGhpZ2hlciB0ZW5kZW5jeSB0byBkaXNjbG9zZSBkaXN0cmVzcywgbG93ZXIgc2NvcmVzIGluZGljYXRlIGdyZWF0ZXIgY29uY2VhbG1lbnQgb2YgZGlzdHJlc3MuDQpgYGB7ciBEREl9DQoNCmRkaTwtbWhoc19kYXRhICU+JSBzZWxlY3QoY29udGFpbnMoIkRESSIpKQ0KDQpkZGk8LWRkaSAlPiUgbXV0YXRlKGFjcm9zcyhjKERESV8yLERESV80LERESV81LERESV84LERESV85LERESV8xMCksfjYtLikpICU+JQ0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShERElfVG90YWw9c3VtKGNfYWNyb3NzKERESV8xOkRESV8xMikpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQpkZGlfc2NvcmluZzwtZGRpICU+JSBkcGx5cjo6c2VsZWN0KERESV8xOkRESV8xMikNCg0Ka2V5X2RkaS5saXN0PC1saXN0KFRvdGFsPWMoMToxMikpDQprZXlfZGRpPC1tYWtlLmtleXMoMTIsa2V5X2RkaS5saXN0LGNvbG5hbWVzKGRkaV9zY29yaW5nKSkNCg0Kc2NhbGVzX2RkaTwtc2NvcmVJdGVtcyhrZXlfZGRpLmxpc3QsZGRpX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc19kZGkpDQoNCmRkaSAlPiUgc2VsZWN0KERESV9Ub3RhbCkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KZGRpICU+JSBzZWxlY3QoRERJX1RvdGFsKSAlPiUgYWRkX2NvbHVtbihnaHNxbCAlPiUgc2VsZWN0KFBlcnNvbmFsLFN1aWNpZGUsR2VuZXJhbCxOb25lX2FsbCkpICU+JSBjb3IucGxvdCguKQ0KDQoNCg0KIyBjaGVja2luZyB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gRERJIGFuZCBvdGhlciBtZWFzdXJlcyBlbnN1cmUgdGhleSBtYWtlIHNlbnNlDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJEdlbmVyYWwpDQpjb3IudGVzdChkZGkkRERJX1RvdGFsLGdoc3FsJFBlcnNvbmFsKQ0KY29yLnRlc3QoZGRpJERESV9Ub3RhbCxnaHNxbCRTdWljaWRlKQ0KY29yLnRlc3QoZGRpJERESV9Ub3RhbCxnaHNxbCROb25lX2FsbCkNCg0KDQojc2F2ZShkZGksZmlsZT0iLi4vMDQtUHJvY2Vzc2VkRGF0YS9kZGkxMjIwMjMuUkRTIikNCmBgYA0KDQojQkZORQ0KDQpDb25zaXN0cyBvZiAxMiBpdGVtcywgcmFuZ2UgMS01DQpJdGVtcyAyLCA0LCA3LCBhbmQgMTAgYXJlIHJldmVyc2Ugc2NvcmVkDQpGb3J3YXJkPSBjKCdCRk5FXzEnLCAnQkZORV8zJywgJ0JGTkVfNScsICdCRk5FXzYnLCAgJ0JGTkVfOCcsICdCRk5FXzknLCAnQkZORV8xMScsICdCRk5FXzEyJyksIFJldmVyc2U9IGMoJ0JGTkVfMicsICdCRk5FXzQnLCAnQkZORV83JywgJ0JGTkVfMTAnKQ0KYGBge3IgQkZORX0NCmJmbmU8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJiZm5lIikpDQoNCmJmbmU8LWJmbmUgJT4lIG11dGF0ZShhY3Jvc3MoYyhCRk5FXzIsQkZORV80LEJGTkVfNyxCRk5FXzEwKSx+Ni0uKSkNCiAgICAgICAgICAgICAgICAgICAgICANCmJmbmVfc2NvcmluZzwtYmZuZSAlPiUgZHBseXI6OnNlbGVjdChCRk5FXzE6QkZORV8xMikNCmtleV9iZm5lLmxpc3Q8LWxpc3QoVG90YWw9YygxOjEyKSkNCmtleV9iZm5lPC1tYWtlLmtleXMoMTIsa2V5X2JmbmUubGlzdCxjb2xuYW1lcyhiZm5lX3Njb3JpbmcpKQ0KDQpzY2FsZXNfYmZuZTwtc2NvcmVJdGVtcyhrZXlfYmZuZS5saXN0LGJmbmVfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX2JmbmUpDQoNCiNzYXZlKGJmbmUsZmlsZT0iLi4vMDQtUHJvY2Vzc2VkRGF0YS9iZm5lMTIyMDIzLlJEUyIpDQoNCmBgYA0KDQojIFRydXN0IHJlc3BlY3Qgc2NhbGUNCjggcXVlc3Rpb25zIDEtc3Ryb25nbHkgZGlzYWdyZWU7IDcgLSBzdHJvbmdseSBhZ3JlZQ0KMiwzLDUsNiByZXZlcnNlLXNjb3JlZA0KDQpgYGB7ciBUUlN9DQp0cnM8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJ0cnMiKSkNCg0KdHJzPC10cnMgJT4lIG11dGF0ZShhY3Jvc3MoYyhUUlNfMixUUlNfMyxUUlNfNSxUUlNfNiksfjgtLikpDQoNCnRyc19zY29yaW5nPC10cnMgJT4lIGRwbHlyOjpzZWxlY3QoVFJTXzE6VFJTXzgpDQprZXlfdHJzLmxpc3Q8LWxpc3QoVG90YWw9YygxOjgpKQ0Ka2V5X3RyczwtbWFrZS5rZXlzKDgsa2V5X3Rycy5saXN0LGNvbG5hbWVzKHRyc19zY29yaW5nKSkNCg0Kc2NhbGVzX3Ryczwtc2NvcmVJdGVtcyhrZXlfdHJzLmxpc3QsdHJzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc190cnMpDQoNCnRycyAlPiUgc2VsZWN0KFRSU18xOlRSU184KSAlPiUgZ2F0aGVyKCkgJT4lICBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXksY29sb3I9dmFsdWUpKStnZW9tX2JveHBsb3QoKStnZW9tX2ppdHRlcigpDQoNCiNzYXZlKHRycyxmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL3RyczEyMjAyMy5SRFMiKQ0KDQoNCmBgYA0KDQojIFRydXN0IGluIFBoeXNpY2lhbiBTY2FsZQ0KDQoxIChzdHJvbmdseSBkaXNhZ3JlZSktIDUgKHN0cm9uZ2x5IGFncmVlKQ0KMTEgaXRlbXMsIHVud2VpZ2h0ZWQgbWVhbiBvZiByZXNwb25zZQ0KcmV2ZXJzZSBzY29yZWQgLSAxLCA1LCA3LCAxMQ0Kb3JpZ2luYWwgc2NhbGUgYWxwaGEgPSAuOTANCg0KU3VtbWFyeSBzY29yZSBvZiBtZWRpY2FsIHNrZXB0aWNpc20gd2FzIG9idGFpbmVkIGJ5IHRha2luZyB0aGUgdW53ZWlnaHRlZCBtZWFuIG9mIHRoZSBmb3VyIGl0ZW1zLiANCmBgYHtyIFRQU30NCg0KdHBzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygidHBzIikpDQoNCnRwczwtdHBzICU+JSBtdXRhdGUoYWNyb3NzKGMoVFBTXzEsVFBTXzUsVFBTXzcsVFBTXzExKSx+Ni0uKSkgJT4lIA0KICByb3d3aXNlKCkgJT4lIG11dGF0ZShUUFNfVG90PXN1bShjX2Fjcm9zcyhUUFNfMTpUUFNfMTEpKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KI3NlbGVjdGluZyB0aGUgd3JpdGUtaW5zDQp0cHMgJT4lIGZpbHRlcihUUFNfTyE9IiIpICU+JSBzZWxlY3QoVFBTX08pDQoNCnRwc19zY29yaW5nPC10cHMgJT4lIGRwbHlyOjpzZWxlY3QoVFBTXzE6VFBTXzExKQ0Ka2V5X3Rwcy5saXN0PC1saXN0KFRvdGFsPWMoMToxMSkpDQprZXlfdHBzPC1tYWtlLmtleXMoMTEsa2V5X3Rwcy5saXN0LGNvbG5hbWVzKHRwc19zY29yaW5nKSkNCg0Kc2NhbGVzX3Rwczwtc2NvcmVJdGVtcyhrZXlfdHBzLmxpc3QsdHBzX3Njb3JpbmcpDQpzdW1tYXJ5KHNjYWxlc190cHMpDQoNCnRwcyAlPiUgc2VsZWN0KFRQU18xOlRQU18xMSkgJT4lIGdhdGhlcigpICU+JSAgZ2dwbG90KGFlcyh5PXZhbHVlLHg9a2V5LGNvbG9yPXZhbHVlKSkrZ2VvbV9ib3hwbG90KCkrZ2VvbV9qaXR0ZXIoKQ0KDQojc2F2ZSh0cHMsZmlsZT0iLi4vMDQtUHJvY2Vzc2VkRGF0YS90cHMxMjIwMjMuUkRTIikNCg0KDQpgYGANCiMgRXRobmljIElkZW50aXR5IFNjYWxlDQoNCnJldmVyc2Ugc2NvcmUgNCw1LDgNCg0KYGBge3IgRUlTfQ0KZWlzPC1taGhzX2RhdGEgJT4lIHNlbGVjdChjb250YWlucygiZWlzIikpDQoNCiMgaWRlbnRpdHkgcXVlc3Rpb25zDQplaXNfaWQ8LWVpcyAlPiUgc2VsZWN0KEVJU19SRTE6RUlTX0hPUklHSU5fM19URVhUKQ0KZWlzX3Jlc3A8LWVpcyAlPiUgc2VsZWN0KCFFSVNfUkUxOkVJU19IT1JJR0lOXzNfVEVYVCkNCg0KIyBvYnNlcnZlIHRoZSB3cml0ZS1pbnMNCmVpc19pZCAlPiUgZmlsdGVyKEVJU19SRTFfN19URVhUIT0iIikgJT4lIHNlbGVjdChFSVNfUkUxXzdfVEVYVCkNCmVpc19pZCAlPiUgZmlsdGVyKEVJU19IT1JJR0lOXzNfVEVYVCE9IiIpICU+JSBzZWxlY3QoRUlTX0hPUklHSU5fM19URVhUKQ0KDQojIHNlbGVjdGluZyBudW1lcmljIHJlc3BvbnNlcyBvbmx5DQplaXNfcmVzcDwtZWlzX3Jlc3AgJT4lIG11dGF0ZShhY3Jvc3MoYyhFSVNfRXRobmlfNCxFSVNfRXRobmlfNSxFSVNfRXRobmlfOCksfjUtLikpICU+JSANCiAgcm93d2lzZSgpICU+JSBtdXRhdGUoRUlTX1RvdD1zdW0oY19hY3Jvc3MoRUlTX0V0aG5pXzE6RUlTX0V0aG5pXzkpKSkgJT4lIA0KICB1bmdyb3VwKCkNCg0KZWlzX3Njb3Jpbmc8LWVpc19yZXNwICU+JSBkcGx5cjo6c2VsZWN0KEVJU19FdGhuaV8xOkVJU19FdGhuaV85KQ0Ka2V5X2Vpcy5saXN0PC1saXN0KFRvdGFsPWMoMTo5KSkNCmtleV9laXM8LW1ha2Uua2V5cyg5LGtleV9laXMubGlzdCxjb2xuYW1lcyhlaXNfc2NvcmluZykpDQoNCnNjYWxlc19laXM8LXNjb3JlSXRlbXMoa2V5X2Vpcy5saXN0LGVpc19zY29yaW5nKQ0Kc3VtbWFyeShzY2FsZXNfZWlzKQ0KDQplaXNfcmVzcCAlPiUgc2VsZWN0KEVJU19FdGhuaV8xOkVJU19FdGhuaV85KSAlPiUgZ2F0aGVyKCkgJT4lICBnZ3Bsb3QoYWVzKHk9dmFsdWUseD1rZXksY29sb3I9dmFsdWUpKStnZW9tX2JveHBsb3QoKStnZW9tX2ppdHRlcigpDQoNCiNzYXZlKGVpcyxlaXNfcmVzcCxlaXNfaWQsZmlsZT0iLi4vMDQtUHJvY2Vzc2VkRGF0YS9laXMxMjIwMjMuUkRTIikNCg0KDQpgYGANCg0KIyBFdmVyeWRheSBJbmlxdWl0eSAtIENvbnRlbnQNCmBgYHtyIEV2SU59DQoNCmBgYA0KDQpgYGB7cn0NCmJpY2Y8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJiaWNmIikpDQoNCmBgYA0KDQoxMCBpdGVtcyAxPXNkIDUgPXNhDQoNClRoZSBudW1iZXJpbmcgaXMgYSBsaXR0bGUgb2RkIG9uIHRoZSBvcmlnaW5hbCBzY2FsZS4gVGhlcmUncyBvbmx5IDEwIGl0ZW1zIG51bWJlcmVkIHRvIDE0Lg0KNyA9IDUNCjggPSA2DQoxMSA9IDcNCjEyID0gOCANCjEzID0gOQ0KMTQgPSAxMA0KcmV2ZXJzZSBzY29yZSA3LCA4LCAxMSwgMTIsIDEzLCAxNCBvbmx5IGZvciB0b3RhbCBzdWJzY2FsZSBtZWFuDQpIYXJtb255OiAxLCAyKiwgMywgNiBIaWdoZXIgc2NvcmVzIG1lYW4gaGlnaGVyIGhhcm1vbnkgKGFmZmVjdGl2ZSkNCkNvbmZsaWN0OiA3LCA4KiwgMTEsIDEyLCAxMywgMTQNCkl0ZW1zIDIgYW5kIDggYXJlIG9ubHkgYXNrZWQgZm9yIHBhcnRpY2lwYW50cyB3aG8gc2VsZi1pZGVudGlmaWVkIGFzIGJpY3VsdHVyYWwuDQoNCmBgYHtyfQ0KI0JJSSBzY29yaW5nIC0gc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3IgdGhpcyB3b25reSBudW1iZXJpbmcgYnVzaW5lc3MNCg0KYmljaWk8LW1oaHNfZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJiaWNpaSIpKQ0KDQpCSUNJSTwtYmljaWkgJT4lIG11dGF0ZShhY3Jvc3MoYyhCSUNJSV81LEJJQ0lJXzYsQklDSUlfNyxCSUNJSV84LEJJQ0lJXzksQklDSUlfMTApLH42LS4pKQ0KDQpCSUNJSV9zY29yaW5nPC1CSUNJSSAlPiUgZHBseXI6OnNlbGVjdChCSUNJSV8xOkJJQ0lJXzEwKQ0Ka2V5X0JJQ0lJLmxpc3Q8LWxpc3QoVG90YWw9YygxOjEwKSkNCmtleV9CSUNJSTwtbWFrZS5rZXlzKDEwLGtleV9CSUNJSS5saXN0LGNvbG5hbWVzKEJJQ0lJX3Njb3JpbmcpKQ0KDQpzY2FsZXNfQklDSUk8LXNjb3JlSXRlbXMoa2V5X0JJQ0lJLmxpc3QsQklDSUlfc2NvcmluZykNCnN1bW1hcnkoc2NhbGVzX0JJQ0lJKQ0KDQojc2F2ZShiaWNpaSxmaWxlPSIuLi8wNC1Qcm9jZXNzZWREYXRhL2JpY2lpMTIyMDIzLlJEUyIpDQoNCmBgYA0KDQojIFRvc2NhLTMNCg0KYGBge3J9DQoNCmBgYA0KDQojIFJlbGF0aW9uc2hpcCBhc3Nlc3NtZW50IHNjYWxlDQoNCmBgYHtyfQ0KDQpgYGANCg0KIyBTZWxmLWNvbmNlYWxtZW50DQoNCmBgYHtyfQ0KDQpgYGANCg0KIyBNSU5JLUlQSVANCg0KIyBDb21iaW5pbmcgc2NhbGVzIGZvciBwcm9qZWN0cw0KDQpgYGB7ciBLYXlsZWlnaCBob25vcnMgcHJvamVjdH0NCmtheWxlaWdoZGF0YTwtY2JpbmQobWhoc19kYXRhJFJlc3BvbnNlSWQsbWV0YV9kYXRhLG1oaHNfZGVtb3RibCxiaWNpaSxlaXMsZ2hzcWwsaXNtaSx0cnMsdHBzKQ0KI3dyaXRlLmNzdihrYXlsZWlnaGRhdGEsIi4uLzA2LUFuYWx5c2VzLzAzLUtheWxlaWdoL2theWxlaWdoZGF0YTIxMjI0LmNzdiIpDQpgYGANCg0K